#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>

int main()
{
    //putenv("MYVAL=aaaaaaaaaaaaa");
    printf("I am a process, pid: %d, ppid: %d\n", getpid(), getppid());
    pid_t id = fork();
    if(id == 0)
    {
        sleep(1);
        char* const env[] = {
            (char*)"hhhhhh-hhhh",
            (char*)"aaaaa=aaaa",
            NULL
        };
        extern char** environ;
        execle("./mytest","mytest", NULL, environ);
        // execle("./mytest","mytest", NULL, env);
        //execl("./mytest","mytest", "-a", "-b", "-c", NULL);
        // char* const argv[] = {
        //     (char*)"ls",
        //     (char*)"-a",
        //     (char*)"-l",
        //     NULL//记得最后一个是NULL
        // };
        
        // sleep(2);
        // printf("替换开始\n");
        //execvp("ls", argv);
        //execv("/usr/bin/ls", argv);
        //execlp("ls","ls","-l","-a", NULL);
        //execl("/usr/bin/ls","ls","-l",NULL);
        printf("替换结束\n");
        exit(0);
    }
    pid_t rid = waitpid(id, NULL, 0);
    if(rid > 0)
    {
        printf("wait success\n");
    }
    return 0;
}

// int main()
// {
//     printf("I am a process, pid: %d, ppid: %d\n", getpid(), getppid());
//     printf("替换开始\n");
//     execl("/usr/bin/ls","ls","-l",NULL);
//     printf("替换结束\n");
//     return 0;
// }

//非阻塞等待
// #define NUM 5
// typedef void(*p)();//函数指针类型
// p  task[NUM];//函数指针数组

// void Func1()
// {
//     printf("I am doing Func1\n");
// }
// void Func2()
// {
//     printf("I am doing Func2\n");
// }
// void Func3()
// {
//     printf("I am doing Func3\n");
// }

// void inittask()
// {
//     task[0] = Func1;
//     task[1] = Func2;
//     task[2] = Func3;
//     task[3] = NULL;
// }

// void func()
// {
//     for(int i=0; task[i]; i++)
//     {
//         task[i]();//回调
//     }
// }

// int main()
// {
//     inittask();//初始化
//     pid_t id = fork();
//     if(id == 0)
//     {
//         int cnt = 5;
//         while(cnt--)
//         {
//             printf("child, pid: %d, ppid: %d, cnt: %d\n", getpid(), getppid(), cnt);
//             sleep(1);
//         }
//         exit(1);
//     }
//     int status = 0;
//     pid_t rid = waitpid(id, &status, WNOHANG);
//     while(1)
//     {
//         if(rid > 0)
//         {
//             printf("wait success, rid: %d, status: %d, exit code: %d\n", rid, status, WEXITSTATUS(status));
//             break;
//         }
//         else if(rid == 0)
//         {
//             printf("father do other things\n");
//             func();
//         }
//         else 
//         {
//             perror("waitpid");
//             break;
//         }
//         sleep(1);
//     }
//     return 0;
// }

//宏
// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         //子进程
//         int cnt = 5;
//         while(cnt--)
//         {
//             printf("child, pid: %d, ppid: %d\n", getpid(),getppid());
//             sleep(1);
//         }
//         exit(111);//进程终止
//     }
//     //父进程
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0);
//     if(rid > 0)
//     {
//         if(WIFEXITED(status))
//         {
//             printf("wait success, rid: %d, status: %d, exit code: %d\n", rid, status, WEXITSTATUS(status));
//         }
//         else 
//         {
//             printf("child process error\n");
//         }
//     }
//     printf("回收成功\n");
//     return 0;
// }

//位运算
// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         //子进程
//         int cnt = 50;
//         while(cnt--)
//         {
//             printf("child, pid: %d, ppid: %d\n", getpid(),getppid());
//             sleep(1);
//         }
//         exit(1);//进程终止
//     }
//     //父进程
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0);
//     if(rid > 0)
//     {
//         // status & 0x7F: 0000 0000 0000 0000 0000 0000 0111 1111 
//         printf("wait success, rid: %d, status: %d, exit signo: %d, exit code: %d\n", 
//         rid, status, status&0x7F, (status>>8)&0xFF);
//     }
//     printf("回收成功\n");
//     return 0;
// }

// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         //子进程
//         int cnt = 5;
//         while(cnt--)
//         {
//             printf("child, pid: %d, ppid: %d\n", getpid(),getppid());
//             sleep(1);
//         }
//         exit(1);//进程终止
//     }
//     //父进程
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0);
//     if(rid > 0)
//     {
//         printf("wait success, rid: %d, status: %d\n", rid, status);
//     }
//     printf("回收成功\n");
//     return 0;
// }

// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         //子进程
//         int cnt = 5;
//         while(cnt--)
//         {
//             printf("child, pid: %d, ppid: %d\n", getpid(),getppid());
//             sleep(1);
//         }
//         exit(0);//进程终止
//     }
//     //父进程
//     printf("父进程正在休眠\n");
//     sleep(10);
//     printf("父进程开始回收子进程资源\n");
//     pid_t rid = wait(NULL);
//     if(rid > 0)
//     {
//         printf("wait success, rid: %d\n", rid);
//     }
//     printf("回收成功\n");
//     return 0;
// }